package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.primefaces.model.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.ModeloFabricaDAO;

import com.divemotor.ventarepuestosinternet.model.Marca;
import com.divemotor.ventarepuestosinternet.model.ModeloFabrica;
import com.divemotor.ventarepuestosinternet.model.TipoComponente;
import com.divemotor.ventarepuestosinternet.util.Constantes;

@SuppressWarnings("unchecked")
@Repository(value = "modeloFabricaDAO")
public class ModeloFabricaDAOImpl implements ModeloFabricaDAO, Serializable {

	private static final long serialVersionUID = -8148495041651312746L;
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public ModeloFabrica obtenerPorId(ModeloFabrica modeloFabrica) {
		Criteria criteria = sessionFactory
				.getCurrentSession()
				.createCriteria(ModeloFabrica.class)
				.add(Restrictions
						.eq("modeloFabricaPK.idModeloFabrica", modeloFabrica
								.getModeloFabricaPK().getIdModeloFabrica()))
				.add(Restrictions.eq("modeloFabricaPK.idMarca", modeloFabrica
						.getModeloFabricaPK().getIdMarca()))
				.add(Restrictions.eq("modeloFabricaPK.idTipoComponente",
						modeloFabrica.getModeloFabricaPK()
								.getIdTipoComponente()));
		return (ModeloFabrica) criteria.uniqueResult();
	}

	@Override
	public List<ModeloFabrica> listarPorTipoComponente(TipoComponente tipoComponente) {
		Criteria criteria = sessionFactory
				.getCurrentSession()
				.createCriteria(ModeloFabrica.class, "modeloFabrica")
				.createAlias("modeloFabrica.tipoComponente", "tipoComponente")
				.add(Restrictions.eq("tipoComponente.idTipoComponente",
						tipoComponente.getIdTipoComponente()))
				.addOrder(Order.asc("modeloFabrica.nombre"));
		return criteria.list();
	}

	@Override
	public List<ModeloFabrica> listarActivosPorTipoComponente(TipoComponente tipoComponente) {

		Criteria criteria = sessionFactory
				.getCurrentSession()
				.createCriteria(ModeloFabrica.class, "modeloFabrica")
				.createAlias("modeloFabrica.tipoComponente", "tipoComponente")
				.add(Restrictions.eq("tipoComponente.idTipoComponente",
						tipoComponente.getIdTipoComponente()))
				.add(Restrictions.eq("modeloFabrica.estado",
						Constantes.ESTADO_ACTIVO))
				.addOrder(Order.asc("modeloFabrica.nombre"));
		return criteria.list();
	}

	@Override
	public List<ModeloFabrica> listarActivosPorMarcaYTipoComponente(Marca marca, TipoComponente tipoComponente) {
		Criteria criteria = sessionFactory
				.getCurrentSession()
				.createCriteria(ModeloFabrica.class, "modeloFabrica")
				.createAlias("modeloFabrica.marca", "marca")
				.createAlias("modeloFabrica.tipoComponente", "tipoComponente")
				.add(Restrictions.eq("marca.codigoMarca",
						marca.getCodigoMarca()))
				.add(Restrictions.eq("tipoComponente.idTipoComponente",
						tipoComponente.getIdTipoComponente()))
				.add(Restrictions.eq("modeloFabrica.estado",
						Constantes.ESTADO_ACTIVO))
				.addOrder(Order.asc("modeloFabrica.nombre"));
		return criteria.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ModeloFabrica> buscar(int first, int pageSize, SortOrder sortOrder, String sortedField, 
									  ModeloFabrica modeloFabrica) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
				ModeloFabrica.class, "modeloFabrica");
		criteria.createAlias("modeloFabrica.tipoComponente", "tipoComponente");
		criteria.createAlias("modeloFabrica.marca", "marca");

		if (modeloFabrica.getTipoComponente() != null 
				&& !modeloFabrica.getTipoComponente().getIdTipoComponente().equals(Constantes.NO_SELECCIONADO.toString())) {
			criteria.add(Restrictions.eq("tipoComponente.idTipoComponente", modeloFabrica.getTipoComponente().
																						  getIdTipoComponente()));
		}

		if (modeloFabrica.getMarca() != null
				&& !modeloFabrica.getMarca().getCodigoMarca()
						.equals(Constantes.NO_SELECCIONADO.toString())) {
			criteria.add(Restrictions.eq("marca.codigoMarca", modeloFabrica
					.getMarca().getCodigoMarca()));
		}

		if (modeloFabrica.getModeloFabricaPK() != null
				&& modeloFabrica.getModeloFabricaPK().getIdModeloFabrica() != null
				&& !modeloFabrica.getModeloFabricaPK().getIdModeloFabrica()
						.equals("")) {
			criteria.add(Restrictions.like(
					"modeloFabrica.modeloFabricaPK.idModeloFabrica",
					"%" + modeloFabrica.getModeloFabricaPK().getIdModeloFabrica() + "%").ignoreCase());
		}

		if (modeloFabrica.getNombre() != null
				&& !modeloFabrica.getNombre().equals("")) {
			criteria.add(Restrictions.like("modeloFabrica.nombre",
					"%" + modeloFabrica.getNombre() + "%").ignoreCase());
		}

		criteria.setFirstResult(first);
		criteria.setMaxResults(pageSize);

		if (!(sortedField == null)) {
			if (sortOrder.toString().equals("ASCENDING"))
				criteria.addOrder(Order.asc(sortedField.toString()));
			else {
				criteria.addOrder(Order.desc(sortedField.toString()));
			}
		}

		return criteria.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Integer cantidadBuscar(ModeloFabrica modeloFabrica) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(
				ModeloFabrica.class, "modeloFabrica");
		criteria.createAlias("modeloFabrica.tipoComponente", "tipoComponente");
		criteria.createAlias("modeloFabrica.marca", "marca");
		criteria.setProjection(Projections.rowCount());

		if (modeloFabrica.getTipoComponente() != null
				&& !modeloFabrica.getTipoComponente().getIdTipoComponente()
						.equals(Constantes.NO_SELECCIONADO.toString())) {
			criteria.add(Restrictions.eq("tipoComponente.idTipoComponente",
					modeloFabrica.getTipoComponente().getIdTipoComponente()));
		}

		if (modeloFabrica.getMarca() != null
				&& !modeloFabrica.getMarca().getCodigoMarca()
						.equals(Constantes.NO_SELECCIONADO.toString())) {
			criteria.add(Restrictions.eq("marca.codigoMarca", modeloFabrica
					.getMarca().getCodigoMarca()));
		}
		if (modeloFabrica.getModeloFabricaPK() != null
				&& modeloFabrica.getModeloFabricaPK().getIdModeloFabrica() != null
				&& !modeloFabrica.getModeloFabricaPK().getIdModeloFabrica().equals("")) {
			criteria.add(Restrictions.like("modeloFabrica.modeloFabricaPK.idModeloFabrica",
					"%" + modeloFabrica.getModeloFabricaPK().getIdModeloFabrica() + "%").ignoreCase());
		}

		if (modeloFabrica.getNombre() != null && !modeloFabrica.getNombre().equals("")) {
			criteria.add(Restrictions.like("modeloFabrica.nombre", "%" + modeloFabrica.getNombre() + "%").ignoreCase());
		}

		Number result = (Number) criteria.uniqueResult();

		return new Integer(result.intValue());
	}

}
